package cn.kgc.gmall.utils;

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 线程池工具类
 * 作用: 为要请求的数据库开启多线程
 */
public class ThreadPoolUtil {

    // 创建线程执行器对象  单例模式 饿汉模式:先创建对象  懒汉模式:用的时候再创建对象
    private static  ThreadPoolExecutor poolExecutor = null;



    /**
     * 编写获取线程池对象的方法
     * corePoolSize - 保留在池中的线程数，即使它们是空闲的，除非设置allowCoreThreadTimeOut
     * maximumPoolSize – 池中允许的最大线程数
     * keepAliveTime – 当线程数大于核心时，这是多余的空闲线程在终止前等待新任务的最长时间。
     * unit – keepAliveTime参数的时间单位
     * workQueue – 用于在执行任务之前保存任务的队列。此队列将仅保存由execute方法提交的Runnable任务。
     * 双里锁
     * @return
     */
    public static  ThreadPoolExecutor getInstance(){
        if (poolExecutor == null){
            synchronized (ThreadPoolUtil.class){
                if (poolExecutor == null){
                    poolExecutor = new ThreadPoolExecutor(
                            4,
                            20,
                            60,
                            TimeUnit.SECONDS,
                            new LinkedBlockingQueue<>(Integer.MAX_VALUE)
                    );
                }
            }
        }
        return poolExecutor;
    }

}
